From d5b6445d6587473f9bb669fa7117c2621408b8ca Mon Sep 17 00:00:00 2001 From: Fuwn Date: Fri, 29 Dec 2023 22:17:10 -0800 Subject: feat(badges): live update on delete and add --- src/routes/user/[user]/badges/+page.svelte | 180 +++++++++++++++++------------ 1 file changed, 105 insertions(+), 75 deletions(-) (limited to 'src/routes/user/[user]') diff --git a/src/routes/user/[user]/badges/+page.svelte b/src/routes/user/[user]/badges/+page.svelte index febf5bdf..8a15425c 100644 --- a/src/routes/user/[user]/badges/+page.svelte +++ b/src/routes/user/[user]/badges/+page.svelte @@ -14,7 +14,7 @@ let currentUserIdentity: ReturnType; let error: null | string; // const socket = io(); - let badges: Badge[] | null = null; + let badgesPromise: Promise; let dark = true; let transparent = false; let confirmDelete = 0; @@ -22,7 +22,7 @@ onMount(async () => { // socket.on('badges', (message) => (badges = message)); - badges = await (await fetch(`/api/badges?id=${(await user(data.username)).id}`)).json(); + badgesPromise = fetch(`/api/badges?id=${(await user(data.username)).id}`); if (data.user) { currentUserIdentity = userIdentity(data.user); @@ -62,12 +62,16 @@ { method: 'PUT' } - ).then(() => { - error = null; - imageURL.value = ''; - activityURL.value = ''; - description.value = ''; - }); + ) + .then(() => { + error = null; + imageURL.value = ''; + activityURL.value = ''; + description.value = ''; + }) + .then(async () => { + badgesPromise = fetch(`/api/badges?id=${(await user(data.username)).id}`); + }); }; const removeBadge = (badge: Badge) => { @@ -87,9 +91,13 @@ fetch(`/api/badges?id=${badge.id}`, { method: 'DELETE' - }).then(() => { - (document.querySelector(`#badge-${badge.id}`) as HTMLAnchorElement).style.display = 'none'; - }); + }) + .then(() => { + (document.querySelector(`#badge-${badge.id}`) as HTMLAnchorElement).style.display = 'none'; + }) + .then(async () => { + badgesPromise = fetch(`/api/badges?id=${(await user(data.username)).id}`); + }); }; const screenshot = async () => { @@ -148,74 +156,96 @@ {#await currentUserIdentity} - Loading user identity ... 50% + Loading user identity ... 60% {:then identity} - {@const isOwner = identity && identity.name === data.username} - - {#if isOwner} -

- Back to Profile - • - (editMode = !editMode)}> - {editMode ? 'Disable' : 'Enable'} Edit Mode - - • - screenshot()}>Download - • - Dark Mode - Transparent Background -

- {/if} - - {#if editMode && isOwner} -

- Edit mode is enabled. Click on an image twice to delete it. There is no confirmation, so - be careful! -

- - {#if error} -

{error}

- {/if} + {#await badgesPromise} + Loading badges ... 40% + {:then badgesResponse} + {#if badgesResponse} + {#await badgesResponse.json()} + Loading badges ... 80% + {:then badges} + {@const isOwner = identity && identity.name === data.username} + + {#if isOwner} +

+ Back to Profile + • + (editMode = !editMode)}> + {editMode ? 'Disable' : 'Enable'} Edit Mode + + • + screenshot()}>Download + • + Dark Mode + Transparent Background +

+ {/if} -

- - - - Add Badge -

- {/if} - -
- {#if badges === null} - {@html nbsp('Loading badges ... 50%')} - {:else if badges.length === 0} - {@html nbsp('No badges found for this user.')} - {:else} - {#each badges as badge} - {#if editMode} - removeBadge(badge)} id={`badge-${badge.id}`}> - {badge.description} - - {:else} - - {badge.description} - + {#if editMode && isOwner} +

+ Edit mode is enabled. Click on an image twice to delete it. There is no confirmation, + so be careful! +

+ + {#if error} +

{error}

+ {/if} + +

+ + + + Add Badge +

{/if} - {/each} + +
+ {#if badges === null} + {@html nbsp('Loading badges ... 50%')} + {:else if badges.length === 0} + {@html nbsp('No badges found for this user.')} + {:else} + {#each badges as badge} + {#if editMode} + removeBadge(badge)} id={`badge-${badge.id}`}> + {badge.description} + + {:else} + + {badge.description} + + {/if} + {/each} + {/if} +
+ {:catch} +

Could not parse badges

+ {/await} + {:else} + Loading badges ... 20% {/if} -
+ {:catch} +

Could not fetch badges

+ {/await} {/await}